﻿--- Eliminar las funciones existentes sin importar el numero ni tipo de parametros
SELECT * FROM "DropFunction_AWIL"('FuncSeguridadPermiso');
--- crear una nueva funcion
CREATE FUNCTION "FuncSeguridadPermiso"(
	 IN	"@OP" CHARACTER VARYING(64)
	,IN	"@paramAux" TEXT
	,INOUT	"@id" INTEGER
	,INOUT	"@fechaGrab" timestamp
	,INOUT	"@usuarioGrab" character varying(32)
	,INOUT	"@activo" boolean
	,INOUT	"@codPermiso" character varying(32)
	,INOUT	"@codPermisoTipo" character varying(128)
	,INOUT	"@nombrePermiso" character varying(128)
	,INOUT	"@descripcion" character varying(256)
	,INOUT	"@orden" INTEGER
)RETURNS 
	SETOF RECORD
AS $$ 
DECLARE
	Auxiliar TEXT;
BEGIN

	/*Validar permiso By CodUsuario*/
	IF "@OP"='validarPermisoByUsuario' THEN
		IF NOT EXISTS (
			select 1
			from 
				"SeguridadRolPermiso" rolPer
				INNER JOIN "SeguridadUsuarioRol" usuRol
					ON rolPer."codRol"=usuRol."codRol"
				INNER JOIN "SeguridadUsuario" usu
					ON usuRol."codUsuario"=usu."codUsuario"
			where
				usu."codUsuario"="@usuarioGrab" and rolPer."codPermiso"="@codPermiso"
		) THEN
			--Auxiliar = 'El usuario "' || "@usuarioGrab" || '" No Tiene los Permisos Necesarios para Realizar esta Operacion. Verifique.';
			Auxiliar = 'No Tiene los Permisos Necesarios para Realizar esta Operacion. Verifique.';
			RAISE EXCEPTION '%', Auxiliar;
		END IF;
	RETURN;
	END IF;

	/*SELECT By Roles*/
	IF "@OP"='selectByCodRol' THEN
		RETURN	QUERY 
		SELECT	t1."id",t1."fechaGrab",t1."usuarioGrab",CASE WHEN t2."codPermiso" IS NULL THEN false ELSE true END,t1."codPermiso",t1."codPermisoTipo",t1."nombrePermiso",t1."descripcion",t1."orden"
		FROM	"SeguridadPermiso" t1 LEFT JOIN "SeguridadRolPermiso" t2 on t1."codPermiso"=t2."codPermiso" and t2."codRol"="@paramAux"
		ORDER BY t1."orden",t1."codPermiso";
	RETURN;
	END IF;
	
	/*SELECT BY CODIGO*/
	IF "@OP"='selectByCodigo' THEN
		RETURN	QUERY
		SELECT	"id","fechaGrab","usuarioGrab","activo","codPermiso","codPermisoTipo","nombrePermiso","descripcion","orden"
		FROM	"SeguridadPermiso"
		WHERE	"codPermiso"="codPermiso";
	RETURN;
	END IF;

	/*SELECT TODOS*/
	IF "@OP"='selectAll' THEN
		RETURN	QUERY
		SELECT	"id","fechaGrab","usuarioGrab","activo","codPermiso","codPermisoTipo","nombrePermiso","descripcion","orden"
		FROM	"SeguridadPermiso";
	RETURN;
	END IF;

	/*INSERTAR NUEVO REGISTRO*/
	IF "@OP"='insert' THEN

		--- Verifico que no exista  con ese CODIGO
		IF EXISTS (SELECT 1 FROM "SeguridadPermiso" WHERE "codPermiso"="@codPermisoTipo" || '.' || "@codPermiso") THEN
			Auxiliar = 'Ya existe un permiso con el codigo "' || "@codPermiso" || '" asociado al tipo de permiso "' || "@codPermisoTipo" || '", verifique.';
			RAISE EXCEPTION '%', Auxiliar;
		END IF;

		--- Verifico que no exista con ese NOMBRE
		IF EXISTS (SELECT 1 FROM "SeguridadPermiso" WHERE "nombrePermiso"="@nombrePermiso") THEN
			Auxiliar = 'Ya existe un permiso con el Nombre "' || "@nombrePermiso" || '", verifique.';
			RAISE EXCEPTION '%', Auxiliar;
		END IF;

		-- Grabo el registro
		INSERT INTO "SeguridadPermiso" ("usuarioGrab","usuarioUltMod","activo","codPermiso","codPermisoTipo","nombrePermiso","descripcion","orden")
		VALUES	 (
				 "@usuarioGrab"
				,"@usuarioGrab"
				,coalesce("@activo",TRUE)
				,"@codPermisoTipo" || '.' || "@codPermiso"
				,"@codPermisoTipo"
				,coalesce("@nombrePermiso","@codPermiso" || ' ' || "@codPermisoTipo")
				,coalesce("@descripcion",coalesce("@nombrePermiso","@codPermiso" || ' ' || "@codPermisoTipo"))
				,coalesce("@orden",0)
			);
		
		RETURN	QUERY
		SELECT	"id","fechaGrab","usuarioGrab","activo","codPermiso","codPermisoTipo","nombrePermiso","descripcion","orden"
		FROM	"SeguridadPermiso"
		ORDER BY "id" DESC LIMIT 1;
	RETURN;
	END IF;

	/*ACTUALIZAR REGISTRO*/
	IF "@OP"='update' THEN
		--- Verifico que no exista  con el nuevo CODIGO
		IF EXISTS (SELECT 1 FROM "SeguridadPermiso" WHERE "codPermiso"="@codPermiso" AND "id"<>"@id") THEN
			Auxiliar = 'Ya existe Otro permiso con el codigo "' || "@codPermiso" || '", verifique.';
			RAISE EXCEPTION '%', Auxiliar;
		END IF;

		--- Verifico que no exista  con ese NOMBRE
		IF EXISTS (SELECT 1 FROM "SeguridadPermiso" WHERE "nombrePermiso"="@nombrePermiso" AND "id"<>"@id") THEN
			Auxiliar = 'Ya existe Otro permiso con el Nombre "' || "@nombrePermiso" || '", verifique.';
			RAISE EXCEPTION '%', Auxiliar;
		END IF;

		--- Actualizo el registro
		UPDATE	
			"SeguridadPermiso" 
		SET	
			 "activo"=coalesce("@activo","activo")
			,"fechaUltMod"=NOW() 
			,"usuarioUltMod"="@usuarioGrab" 
			,"codPermiso"="@codPermiso"
			,"codPermisoTipo"="@codPermisoTipo"
			,"nombrePermiso"="@nombrePermiso"			
			,"descripcion"=coalesce("@descripcion","@nombrePermiso")
			,"orden"="@orden"
		WHERE	
			"id"="@id";

	RETURN;
	END IF;

	/*ELIMINAR REGISTRO*/
	IF "@OP"='delete' THEN

		--- Borro el registro
		DELETE FROM "SeguridadPermiso" 
		WHERE "id"="@id";

	RETURN;
	END IF;


--- Controlo que se haya digitado el OP correctamente
	IF "@OP" IS NOT NULL THEN
		Auxiliar = 'El OP "' || "@OP" || '" No existe, verifique.';
		RAISE EXCEPTION '%', Auxiliar;
	RETURN;
	END IF;
END;
$$ LANGUAGE 'plpgsql';

